#ifndef IPC_SERVER_H
#define IPC_SERVER_H

#include "ipc_data.h"

// 目前跑通流程，不考虑效率问题

// 概念: 
// 服务器:		一个bin进程就是一个服务器
// 服务: 		一个服务器上面可以运行一个或者多个服务
// 服务控制器:  接收到的客户端命令会根据id转移到对应的服务控制器,服务控制器可以对数据进行进一步的处理
namespace ipc
{
	// 服务控制器(接口)
	// 通常控制器解释参数然后传递给对应的服务进行处理
	class IServiceController
	{
	public:
		// 接收到客户端的异步数据
		virtual void onPost(Bundle& data) = 0;
		
		// 接收到客户端的同步数据，并返回处理结果
		virtual const Bundle onSend(Bundle& data) = 0;
		
		// 接收到客户端的注册id, 更新数据给客户端(这里模糊connection类型,以便适配多种IPC实现,例如GDBUS,BINDER)
		virtual void handleUpdate(const void* connection, const std::string& id, int64_t observerId) = 0;
	};
	
	// 服务控制器工厂(接口)
	class IServiceControllerFactory
	{
	public:	
		// 通过服务名寻找对应的服务控制器，转移服务器接收到客户端命令给此控制器
		virtual IServiceController* getServiceController(const std::string& serviceName) = 0;
	};
	
	// 服务器
	class Server
	{
	public:
		static Server* getInstance();
		
	public:
		// 设置服务控制器工厂
		void setServiceControllerFactory(IServiceControllerFactory* factory);
		
		// 创建服务
		void newService(std::string serviceName);
		
		// 更新数据给在监听的通道
		void update(Bundle& data);
		
		// 更新数据给指定通道(这里模糊connection类型,以便适配多种IPC实现,例如GDBUS,BINDER)
		void update(const void* connection, const std::string& id, int64_t observerId, Bundle& data);
		
	public:
		// 回调基本类型给和id关联的通道
		void updateInt8(const std::string& id, int8_t value);
		void updateInt16(const std::string& id, int16_t value);
		void updateInt32(const std::string& id, int32_t value);
		void updateInt64(const std::string& id, int64_t value);
		void updateFloat(const std::string& id, float value);
		void updateDouble(const std::string& id, double value);		
		void updateString(const std::string& id, const std::string& value);
		
		// 回调基本类型数组给和id关联的通道
		void updateInt8Vector(const std::string& id, const std::vector<int8_t>& value);
		void updateInt16Vector(const std::string& id, const std::vector<int16_t>& value);
		void updateInt32Vector(const std::string& id, const std::vector<int32_t>& value);
		void updateInt64Vector(const std::string& id, const std::vector<int64_t>& value);
		void updateFloatVector(const std::string& id, const std::vector<float>& value);
		void updateDoubleVector(const std::string& id, const std::vector<double>& value);
		void updateStringVector(const std::string& id, const std::vector<std::string>& value);
		
		// 回调基本类型数组给和id关联的通道(右值版本, 防止大规模变量拷贝)
		void updateInt8Vector(const std::string& id, std::vector<int8_t>&& value);
		void updateInt16Vector(const std::string& id, std::vector<int16_t>&& value);
		void updateInt32Vector(const std::string& id, std::vector<int32_t>&& value);
		void updateInt64Vector(const std::string& id, std::vector<int64_t>&& value);
		void updateFloatVector(const std::string& id, std::vector<float>&& value);
		void updateDoubleVector(const std::string& id, std::vector<double>&& value);
		void updateStringVector(const std::string& id, std::vector<std::string>&& value);
		
		// 回调基本类型给指定通道(通常在是IServiceController::handleUpdate中调用)
		void updateInt8(const void* connection, const std::string& id, int64_t observerId, int8_t value);
		void updateInt16(const void* connection, const std::string& id, int64_t observerId, int16_t value);
		void updateInt32(const void* connection, const std::string& id, int64_t observerId, int32_t value);
		void updateInt64(const void* connection, const std::string& id, int64_t observerId, int64_t value);
		void updateFloat(const void* connection, const std::string& id, int64_t observerId, float value);
		void updateDouble(const void* connection, const std::string& id, int64_t observerId, double value);		
		void updateString(const void* connection, const std::string& id, int64_t observerId, std::string value);
		
		// 回调基本类型数组给指定通道(通常在是IServiceController::handleUpdate中调用)
		void updateInt8Vector(const void* connection, const std::string& id, int64_t observerId, const std::vector<int8_t>& value);
		void updateInt16Vector(const void* connection, const std::string& id, int64_t observerId, const std::vector<int16_t>& value);
		void updateInt32Vector(const void* connection, const std::string& id, int64_t observerId, const std::vector<int32_t>& value);
		void updateInt64Vector(const void* connection, const std::string& id, int64_t observerId, const std::vector<int64_t>& value);
		void updateFloatVector(const void* connection, const std::string& id, int64_t observerId, const std::vector<float>& value);
		void updateDoubleVector(const void* connection, const std::string& id, int64_t observerId, const std::vector<double>& value);
		void updateStringVector(const void* connection, const std::string& id, int64_t observerId, const std::vector<std::string>& value);
		
		// 回调基本类型数组给指定通道(通常在是IServiceController::handleUpdate中调用)(右值版本, 防止大规模变量拷贝)
		void updateInt8Vector(const void* connection, const std::string& id, int64_t observerId, std::vector<int8_t>&& value);
		void updateInt16Vector(const void* connection, const std::string& id, int64_t observerId, std::vector<int16_t>&& value);
		void updateInt32Vector(const void* connection, const std::string& id, int64_t observerId, std::vector<int32_t>&& value);
		void updateInt64Vector(const void* connection, const std::string& id, int64_t observerId, std::vector<int64_t>&& value);
		void updateFloatVector(const void* connection, const std::string& id, int64_t observerId, std::vector<float>&& value);
		void updateDoubleVector(const void* connection, const std::string& id, int64_t observerId, std::vector<double>&& value);
		void updateStringVector(const void* connection, const std::string& id, int64_t observerId, std::vector<std::string>&& value);
	};
}

#endif

/**
用法:
1. 实现IServiceController，创建对应的对象
2. 实现IServiceControllerFactory, 根据serviceName返回IServiceController
3. 调用Server::setServiceControllerFactory
4. 调用一次或者多次Server::newService创建若干服务
*/
